﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace MakeIT.Deo.Negocios
{
    public class AcessoBO
    {

        private deoEntities modelo = null;

        public AcessoBO()
        {
            modelo = new deoEntities();
        }

        /// <summary>
        /// Recupera uma Lista de Categorias através do Título e do Código    
        /// </summary>
        /// <param name="titulo"></param>
        /// <param name="idCategoria"></param>
        /// <returns></returns>
        public acessos RecuperaAcessos(string pagina, int dia, int mes, int ano, int hora, int? idCategoria, int? idFamilia, int? idSubFamilia, int? idProduto)
        {
            // declara objetos
            IQueryable<acessos> query = modelo.acessos;

            try
            {
                query = query.Where(a => a.Pagina.Equals(pagina) && a.Dia == dia && a.Mes == mes && a.Ano == ano && a.Hora == hora);

                if (idCategoria != null) query = query.Where(a => a.IdCategoria == idCategoria);
                else query = query.Where(a => a.IdCategoria == null);

                if (idFamilia != null) query = query.Where(a => a.IdFamilia == idFamilia);
                else query = query.Where(a => a.IdFamilia == null);

                if (idSubFamilia != null) query = query.Where(a => a.IdSubFamilia == idSubFamilia);
                else query = query.Where(a => a.IdSubFamilia == null);

                if (idProduto != null) query = query.Where(a => a.IdProduto == idProduto);
                else query = query.Where(a => a.IdProduto == null);
                
                var retornaLista = from ac in query
                                   select ac;

                if (retornaLista!=null && retornaLista.Count() > 0)
                {
                    return retornaLista.ToList()[0];

                }
                else
                {
                    return null;
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
        }

        /// <summary>
        /// Excluir um determinado registro 
        /// </summary>
        /// <param name="entidade">Registro a ser excluido</param>
        /// <param name="msg"></param>
        /// <returns>Retorna uma msg quando há, a qual sinaliza algum fluxo alternativo</returns>
        public void DeletaAcessos(acessos entidade)
        {
            try
            {
                EntityKey key = new EntityKey(modelo.DefaultContainerName + ".acessos", "IdAcesso", entidade.IdAcesso);
                modelo.DeleteObject(modelo.GetObjectByKey(key));
                modelo.SaveChanges();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Salva um novo registro ou atualiza um já existente 
        /// </summary>
        /// <param name="entidade"></param>
        /// <param name="novo"></param>
        public void SalvaAcesso(acessos ac)
        {
            try
            {

                acessos entidade =RecuperaAcessos(ac.Pagina, ac.Dia.Value, ac.Mes.Value, ac.Ano.Value, ac.Hora.Value, 
                                    ac.IdCategoria, ac.IdFamilia, ac.IdSubFamilia, ac.IdProduto);
 
                //Verifica se é um registro novo
                if (entidade == null)
                {
                    //Adiciona um novo registro
                    modelo.AddToacessos(ac);
                }
                else
                {
                    entidade.Qtd += ac.Qtd;
                    //Efetiva as mudanças na entidade já existente
                    modelo.ApplyPropertyChanges(entidade.EntityKey.EntitySetName, entidade);
                }

                //Efetiva as mudancas já existentes
                modelo.SaveChanges();

            }
            catch (Exception ex)
            {

                throw ex;
            }
        }


       
    }
}
